
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dvd.gestionnaires;

import dvd.modeles.Film;
import dvd.modeles.Genre;
import dvd.modeles.JouerRole;
import dvd.modeles.Personne;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
@LocalBean
public class gestionnaireDvd {
    
    @PersistenceContext
    private EntityManager em;

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
    public void creerFilmsdeTest() {
        
        creeFilm("Harry Potter partie 2", 11.50, "L'ultime combat", "harrypotter2eme.jpg", "DVD", Genre.FICTION,1);
        creeFilm("Avengers", 19.99, "un ensemble de super héros !!", "avengers.jpeg", "DVD", Genre.FICTION,2);
        creeFilm("Titanic", 15.99, "Southampton 10 avril 1912.", "titanic.jpg", "DVD", Genre.DRAME,3);
        creeFilm("American Pie 4", 16.99, "La bande est réunie 10 ans plus tard", "americanpie4.jpg", "BluRay", Genre.COMEDIE,5);
        creeFilm("Gad Elmaleh", 12, "resume", "gad.jpg", "BluRay", Genre.SPECTACLE,2);
        creeFilm("Mr. & Mrs. Smith", 12, "resume", "smith.jpg", "BluRay", Genre.ACTION,10);
        creeFilm("Docteur House saison 5", 39, "Le Dr Greg House est un brillant médecin.", "drhouse.jpg", "BluRay", Genre.SERIE,3);
        creeFilm("Scream 4", 11.90, "Sidney retourne à Woodsboro pour le lancement de son roman", "scream4.jpg", "DVD", Genre.HORREUR,4);
        creeFilm("Dark Shadows", 12.50, "En 1752, Joshua et Naomi Collins quittent Liverpool, en Angleterre, pour prendre la mer avec leur jeune fils Barnabas, et commencer une nouvelle vie en Amérique.", "darkshadows.jpg", "BluRay", Genre.COMEDIE, 5);
        
    }
    
    public Film creeFilm(String titre, double prix, String resume, String photo, String format, Genre genre,int stock) {
        Film f = new Film(titre, prix, resume, photo, format, genre,stock);
        em.persist(f);
        return f;
    }
    
    public Collection<Film> getAllFilms(int start, int max) {
        // Exécution d'une requête équivalente à un select *  
        Query q = em.createQuery("select f from Film f order by f.titre");
        if (start < 0) {
            start = 0;
        }
        q.setFirstResult(start);
        q.setMaxResults(max);
        return q.getResultList();
    }
    
    public int getNbrFilms() {
        Query q = em.createQuery("select f from Film f");
        return q.getResultList().size();
        
    }
    
    public Collection<Film> getFilmsFromGenre(final String genre) {
        Genre g = Genre.valueOf(genre);
        Query q = em.createQuery("select f from Film f where f.genre = :genre order by f.titre");
        q.setParameter("genre", g);
        
        return q.getResultList();
        
        
    }
    
    public Collection<Film> getFilmsFromTitre(final String titre) {
        Query q = em.createQuery("select f from Film f where lower(f.titre) Like lower(:titre) order by f.titre");
        q.setParameter("titre", "%" + titre + "%");
        return q.getResultList();
    }
    
    public Film getFilmFromTitre(final String titre) {
        Query q = em.createQuery("select f from Film f where lower(f.titre) Like lower(:titre) order by f.titre");
        q.setParameter("titre", "%" + titre + "%");
        return (Film) q.getSingleResult();
    }
    
    public Film getFilmFromId(final int filmid) {
        return em.find(Film.class, filmid);
    }
    
    public void suppFilm(final int filmid) {
        Film f = getFilmFromId(filmid);
        em.remove(f);
        
    }
     
    public Collection<Genre> getAllGenres() {
        Collection<Genre> lesGenres = new ArrayList<Genre>();
        lesGenres.addAll(Arrays.asList(Genre.values()));
        return lesGenres;
    }
    
    public void addStock(final int filmid, int quantite) {
        Film f = getFilmFromId(filmid);
        if (quantite > 0 || Math.abs(quantite) <= f.getStock()) {
            f.addStock(quantite);
        } else {
            f.setStock(0);
        }
        
    }
    
    public void addRole(Film f, JouerRole r) {
        f.addRole(r);
        em.merge(f);
    }
    
    public void suppRole(Film f, JouerRole r) {
        f.suppRole(r);
    }
    
    public void updateFilm(Film f, String titre, double prix, String resume, String format, Genre genre, Personne realisateur) {
        f.setTitre(titre);
        f.setPrix(prix);
        f.setResume(resume);
        f.setFormat(format);
        f.setGenre(genre);
        f.setRealisateur(realisateur);
        em.merge(f);
        
    }
}
